package com.it.common;



import com.google.common.collect.Maps;
import com.it.utils.StringUtils;

import java.io.Serializable;
import java.util.HashMap;

/**
 * @desc:
 * @author: panxiyi
 * @date: 2023/5/27 5:38 下午
 */
public class FrameResp implements Serializable {

    private static final long serialVersionUID = -6150565919767166544L;

    /**
     * degrade
     */
    private int degrade;

    /**
     * ret
     */
    private int ret;

    /**
     * error_code
     */
    private int errorCode;

    /**
     * error
     */
    private String error;

    /**
     * msg
     */
    private String msg;

    /**
     * data
     */
    private Object data;

    /**
     * getDegrade
     *
     * @return
     */
    public int getDegrade() {
        return degrade;
    }

    /**
     * setDegrade
     *
     * @param degrade
     */
    public void setDegrade(int degrade) {
        this.degrade = degrade;
    }

    /**
     * getRet
     *
     * @return
     */
    public int getRet() {
        return ret;
    }

    /**
     * setRet
     *
     * @param ret
     */
    public void setRet(int ret) {
        this.ret = ret;
    }

    /**
     * getErrorCode
     *
     * @return
     */
    public int getErrorCode() {
        return errorCode;
    }

    /**
     * setErrorCode
     *
     * @param errorCode
     */
    public void setErrorCode(int errorCode) {
        this.errorCode = errorCode;
    }

    /**
     * getError
     *
     * @return
     */
    public String getError() {
        return error;
    }

    /**
     * setError
     *
     * @param error
     */
    public void setError(String error) {
        this.error = error;
    }

    /**
     * getMsg
     *
     * @return
     */
    public String getMsg() {
        return msg;
    }

    /**
     * setMsg
     *
     * @param msg
     */
    public void setMsg(String msg) {
        this.msg = msg;
    }

    /**
     * getData
     *
     * @return
     */
    public Object getData() {
        return data;
    }

    /**
     * setData
     *
     * @param data
     */
    public void setData(Object data) {
        this.data = data;
    }

    /**
     * 获取指定类的透传数据
     *
     * @param clazz
     * @param <T>
     * @return
     */
    public <T> T getData(Class<T> clazz) {
        return clazz.cast(this.data);
    }

    /**
     * RET_SUCCESS
     *
     * @param data
     * @return
     */
    public static FrameResp RET_SUCCESS(Object data) {
        FrameResp frameResp = new FrameResp();
        frameResp.setRet(ErrorCategory.RET_SUCCESS.getCode());
        frameResp.setErrorCode(0);
        frameResp.setError("Ok");
        frameResp.setMsg("success");
        frameResp.setData(data);
        return frameResp;
    }

    /**
     * RET_SUCCESS
     * @param message
     * @param data
     * @return
     */
    public static FrameResp RET_SUCCESS(String message, Object data) {
        FrameResp frameResp = new FrameResp();
        frameResp.setRet(ErrorCategory.RET_SUCCESS.getCode());
        frameResp.setErrorCode(0);
        frameResp.setError("Ok");
        frameResp.setMsg(message);
        frameResp.setData(data);
        return frameResp;
    }

    /**
     * RET_SUCCESS
     *
     * @return
     */
    public static FrameResp RET_SUCCESS() {
        FrameResp frameResp = new FrameResp();
        frameResp.setRet(ErrorCategory.RET_SUCCESS.getCode());
        frameResp.setErrorCode(0);
        frameResp.setError("Ok");
        frameResp.setMsg("success");
        frameResp.setData(null);
        return frameResp;
    }

    /**
     * FAILURE
     *
     * @param errorCode
     * @param error
     * @param data
     * @return
     */
    public static FrameResp FAILURE(ErrorCode errorCode, String error, Object data) {
        ErrorCategory category = errorCode.getCategory();
        if (category == ErrorCategory.RET_SUCCESS) {
            return RET_SUCCESS(data);
        } else if (category == ErrorCategory.RET_API) {
            return RET_API(errorCode, error, data);
        } else if (category == ErrorCategory.RET_AUTH) {
            return RET_AUTH(errorCode, error, data);
        } else if (category == ErrorCategory.RET_COMMON) {
            return RET_COMMON(errorCode, error, data);
        } else {
            return RET_INTERNAL(errorCode, error, data);
        }
    }

    /**
     * FAILURE
     *
     * @param errorCode
     * @param error
     * @return
     */
    public static FrameResp FAILURE(ErrorCode errorCode, String error) {
        return FAILURE(errorCode, error, new HashMap<>(0));
    }

    /**
     * RET_COMMON
     *
     * @param errorCode
     * @param data
     * @return
     */
    public static FrameResp RET_COMMON(ErrorCode errorCode, String error, Object data) {
        FrameResp frameResp = new FrameResp();
        frameResp.setRet(ErrorCategory.RET_COMMON.getCode());
        frameResp.setErrorCode(errorCode.getCode());
        String msg = "fail";
        if (errorCode != null && StringUtils.isBlank(errorCode.getMessage())) {
            msg = errorCode.getMessage();
        }
        frameResp.setMsg(msg);
        frameResp.setError(error);
        frameResp.setData(data);
        return frameResp;
    }

    /**
     * RET_COMMON
     *
     * @param errorCode
     * @param error
     * @return
     */
    public static FrameResp RET_COMMON(ErrorCode errorCode, String error) {
        return RET_COMMON(errorCode, error, Maps.newHashMap());
    }

    /**
     * RET_COMMON
     *
     * @param errorCode
     * @return
     */
    public static FrameResp RET_COMMON(ErrorCode errorCode) {
        return RET_COMMON(errorCode, "error", Maps.newHashMap());
    }

    /**
     * RET_AUTH
     *
     * @param errorCode
     * @param error
     * @param data
     * @return
     */
    public static FrameResp RET_AUTH(ErrorCode errorCode, String error, Object data) {
        FrameResp frameResp = new FrameResp();
        frameResp.setRet(ErrorCategory.RET_AUTH.getCode());
        frameResp.setMsg(getMessage(errorCode.toString(), errorCode.getMessage()));
        frameResp.setErrorCode(errorCode.getCode());
        frameResp.setError(error);
        frameResp.setData(data);
        return frameResp;
    }

    /**
     * RET_AUTH
     *
     * @param errorCode
     * @return
     */
    public static FrameResp RET_AUTH(ErrorCode errorCode) {
        return RET_AUTH(errorCode, "error", Maps.newHashMap());
    }


    /**
     * RET_API
     *
     * @param errorCode
     * @param error
     * @param data
     * @return
     */
    public static FrameResp RET_API(ErrorCode errorCode, String error, Object data) {
        FrameResp frameResp = new FrameResp();
        frameResp.setRet(ErrorCategory.RET_API.getCode());
        frameResp.setError(error);
        frameResp.setErrorCode(errorCode.getCode());
        frameResp.setMsg(getMessage(errorCode.toString(), errorCode.getMessage()));
        frameResp.setData(data);
        return frameResp;
    }

    /**
     * RET_API
     *
     * @param errorCode
     * @return
     */
    public static FrameResp RET_API(ErrorCode errorCode) {
        return RET_API(errorCode, "error", Maps.newHashMap());
    }

    /**
     * RET_INTERNAL
     *
     * @param errorCode
     * @param error
     * @param data
     * @return
     */
    public static FrameResp RET_INTERNAL(ErrorCode errorCode, String error, Object data) {
        FrameResp frameResp = new FrameResp();
        frameResp.setErrorCode(errorCode.getCode());
        frameResp.setRet(ErrorCategory.RET_INTERNAL.getCode());
        frameResp.setError(error);
        frameResp.setMsg(getMessage(errorCode.toString(), errorCode.getMessage()));
        frameResp.setData(data);
        return frameResp;
    }

    /**
     * RET_INTERNAL
     *
     * @param errorCode
     * @return
     */
    public static FrameResp RET_INTERNAL(ErrorCode errorCode) {
        return RET_INTERNAL(errorCode, "error", Maps.newHashMap());
    }

    /**
     * RET_DEGRADE
     *
     * @param data
     * @return
     */
    public static FrameResp RET_DEGRADE(Object data) {
        FrameResp frameResp = new FrameResp();
        frameResp.setRet(ErrorCategory.RET_SUCCESS.getCode());
        frameResp.setErrorCode(0);
        frameResp.setError("Ok");
        frameResp.setMsg(getMessage(ErrorCode.SUCCESS.toString(), ErrorCode.SUCCESS.getMessage()));
        frameResp.setDegrade(1);
        frameResp.setData(data);
        return frameResp;
    }

    private static String getMessage(String errorCodeToStr, String message) {
        if (!StringUtils.isBlank(message)) {
            return message;
        }
        return errorCodeToStr;
    }

    public static FrameResp getFrameRespFromErrorCode(ErrorCode errorCode) {
        FrameResp frameResp = new FrameResp();
        frameResp.setErrorCode(errorCode.getCode());
        frameResp.setMsg(errorCode.getMessage());
        return frameResp;
    }
}

